#include <windows.h>
#include <gtk/gtk.h>

/***************************************************
 * 변수
 ***************************************************/
GtkWidget *window;	// 메인 윈도우
GtkWidget *vbox1;
GtkWidget *label1;	// 상태값을 표시

GtkWidget *hbox1;	// 통신 설정
GtkWidget *w_port;	// 통신 포트 선택
GtkWidget *w_baud;	// 통신 속도 선택

GtkWidget *button1; // 통신 열기

HANDLE hSerial;

static void destroy( GtkWidget *widget, gpointer   data );

/***************************************************
 * 입력
 * 출력
 * 사용
 * 설명
 *     시리얼 포트 목록
 ***************************************************/
gchar *D_COMBO_PORT[] = {
	"COM1",
	"COM2",
	"COM3",
	"COM4",
	"COM5",
	"COM6",
	"COM7",
	"COM8",
	"COM9",
	"COM10",
};

/***************************************************
 * 입력
 * 출력
 * 사용
 * 설명
 *     통신 속도 데이터
 ***************************************************/
gchar *D_COMBO_BAUD[] = {
	"2400",
	"4800",
	"9600",
	"19200",
	"38400",
	"57600",
	"115200",
	"128000",
	"256000"
};

/***************************************************
 * 입력
 * 출력
 * 사용
 * 설명
 *     버튼 눌림 처리
 ***************************************************/
void on_button1_clicked(GtkWidget *widget, gpointer   data)
{
	static gchar label[20];

	int port, baud;

	if(hSerial == 0)
	{
		// 시리얼 포트 열기
		port = gtk_combo_box_get_active(w_port);
		baud = gtk_combo_box_get_active(w_baud);

		hSerial = CreateFile(D_COMBO_PORT[port], GENERIC_READ | GENERIC_WRITE, 0, 0,
				OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

		if( hSerial == INVALID_HANDLE_VALUE)
		{
			gtk_label_set_text( label1, "통신 포트 실패");
			return;
		}

		sprintf( label, "%s, %s", D_COMBO_PORT[port], D_COMBO_BAUD[baud]);

		gtk_label_set_text( label1, label);

		gtk_button_set_label( button1, "닫기");
	}
	else
	{
		// 시리얼 포트 닫기
		CloseHandle(hSerial);
		gtk_button_set_label( button1, "열기");
		hSerial = 0;
	}

	return;
}

/***************************************************
 * 입력
 * 출력
 * 사용
 * 설명
 ***************************************************/
int main( int   argc, char *argv[] )
{
	int i;
	
	gtk_init (&argc, &argv);

	/* 전역 변수 초기화 */
	hSerial = 0;

	/* 위젯 생성 */
	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	vbox1 = gtk_vbox_new(FALSE, 0);
	label1 = gtk_label_new("닫힘");

	hbox1 = gtk_hbox_new(FALSE, 0);

	w_port = gtk_combo_box_new_text();

	for(i = 0; i < 10; i++)
		gtk_combo_box_append_text(w_port, D_COMBO_PORT[i] );

	w_baud = gtk_combo_box_new_text();

	for(i = 0; i < 9; i++)
		gtk_combo_box_append_text(w_baud, D_COMBO_BAUD[i] );

	button1 = gtk_button_new_with_label("열기");

	/* 위젯 결합 */
	gtk_box_pack_start( GTK_BOX(hbox1), w_port, TRUE, TRUE, 0);
	gtk_box_pack_start( GTK_BOX(hbox1), w_baud, TRUE, TRUE, 0);

	gtk_box_pack_start( GTK_BOX(vbox1), label1, TRUE, TRUE, 0);
	gtk_box_pack_start( GTK_BOX(vbox1), hbox1, FALSE, FALSE, 0);
	gtk_box_pack_start( GTK_BOX(vbox1), button1, TRUE, TRUE, 0);

	gtk_container_add( GTK_CONTAINER(window), vbox1);

	/* 시그널 연결 */
	g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);
	g_signal_connect (G_OBJECT (button1), "clicked", G_CALLBACK (on_button1_clicked), NULL);

	/*  TODO: type some code */
	
	/* 위젯 보이기 */
	gtk_widget_show_all (window);
	
	gtk_main ();
	
	return 0;
}

static void destroy( GtkWidget *widget, gpointer   data )
{
    gtk_main_quit ();
}

